(function ($) {
    $.fn.scroll = function (options) {
        
        var root = this,                //将当前上下文对象存入root
            timer = [],                 //计时器
            ulTag = $("> ul", root),    //ul标签
            liTag = $("> li", ulTag),   //li标签(集合)
            liNum = liTag.length,       //li标签个数
            liOne = liTag.first(),      //获取单个li标签
            marquee,                    //滚动器(函数)
            liUnit,                     //单个li的宽或者高(横向时为宽，纵向时为高)
            ulUnit,                     //ul的宽或者高(横向时为宽，纵向时为高)
            limit,                      //root的宽或者高(横向时为宽，纵向时为高)
            cssName,                    //样式名称(横向时为margin-left，纵向时为margin-top)
            effect;                     //动画效果(横向时为marginLeft，纵向时为marginTop)

        //默认配置
        var settings = {
            speed: 40,      //滚动速度,值越大速度越慢
            direction: "x"  //滚动方向("x"或者"y" [x横向;y纵向])
        };

        //不为空，则合并参数
        if (options){
            $.extend(settings, options);
        }

        //横向
        if(settings.direction === "x"){
            limit = root.width();
            cssName = "margin-left";
            liUnit = liOne.outerWidth(true);
            ulUnit = liUnit * liNum;            //单个li的宽 ＊ li的个数 ＝ ul的宽度
            effect = { marginLeft : "-=1" };

            ulTag.css({ width: ulUnit });       //设置ul的宽
        }

        //纵向
        if(settings.direction === "y"){
            limit = root.height();
            cssName = "margin-top";
            liUnit = liOne.outerHeight(true);
            ulUnit = liUnit * liNum;            //单个li的高 ＊ li的个数 ＝ ul的高度
            effect = { marginTop : "-=1" };
           
            ulTag.css({ height: ulUnit });      //设置ul的高
        }

        marquee = function(){
            ulTag.animate(effect, 0, function(){

                //ul滚动的距离，取绝对值
                var distance = Math.abs(parseInt($(this).css(cssName),10));

                //如果滚动的距离一旦大于单个li的长度
                if(distance > liUnit){
                    $("> li:first", $(this)).appendTo($(this)); //就把第一个li移到最后
                    $(this).css(cssName, 0);                    //滚动长度归0
                }
            });
        }

        //遵循链式原则，并进行初始化
        return root.each(function (i) {

            //只有当ul的长度大于root长度时才进行滚动
            if(ulUnit > limit){               
                timer[i] = setInterval(marquee,settings.speed);

                //鼠标进入停止滚动，离开继续滚动
                $(this).hover(function () {
                    clearInterval(timer[i]);
                }, function () {
                    timer[i] = setInterval(marquee,settings.speed);
                });
            }
        });

    };
})(jQuery);